 /* Secao das declaracoes */

%option noyywrap
 /* Sera copiado no .c final */
%{
    #include <stdlib.h>
    #include <string.h>
   
    /* este include eh importante... */
    #include "../src/tokens.h"
    
    int VAL_INT;
    double VAL_DOUBLE;
%}
 

 /* Definicoes regulares (A COMPLETAR conforme a especificacao) */

digito     [0-9]
letra      [a-z]
LETRA      [A-Z]

%%

 /* Secao das Regras de traducao */
 /* O que consta aqui eh puramente ilustrativo... A COMPLETAR ! 
  * Ver tambem "tokens.h".
  */

int    { return(INT);    }
double { return(DOUBLE); }
real   { return(REAL);   }
char   { return(CHAR);   }
string { return(STRING); }
"*"    { return('*');    }
"+"    { return('+');    }
"-"    { return('-');    }
"/"    { return('/');    }
","    { return(',');    }
";"    { return(';');    }
":"    { return(':');    }
"'"    { return(QUOTE);  }
"("    { return('(');    }
")"    { return(')');    }
"["    { return('[');    }
"]"    { return(']');    }
"{"    { return('{');    }
"}"    { return('}');    }
"<"    { return('<');    }
">"    { return('>');    }
"="    { return('=');    }
"<="   { return(LE);     }
">="   { return(GE);     }
"=="   { return(EQ);     }
"<>"   { return(NE);     }
"&"    { return(AND);    }
"|"    { return(OR);     }
"!"    { return(NOT);    }
if     { return( IF );   }
then   { return( THEN ); }
else   { return( ELSE ); }
for    { return( FOR );  }
next   { return( NEXT ); }
while  { return( WHILE );}
end    { return( END );  }
true   { return( TRUE ); }
false  { return( FALSE );}

[ \t\n]+					{ return 5; }
({letra}|[_])+({letra}|{LETRA}|[_]|{digito})*  	{ return( IDF ); }
{LETRA}+([_]|{LETRA}|{digito})*	        	{ return( CONST ); }
["]({letra}|{LETRA}|{digito}|[ ])*["]		{ return( STR_LIT ); }
{digito}+					{ return( INT_LIT ); }
{digito}*\.{digito}+(([eE])([+-])?{digito}+)?   { return( F_LIT ); }

  /* Tratamento dos erros lexicais: a regra seguinte pega tudo o que nao
   * fechou com uma Regexp anterior.
   */
. { printf("Erro lexical - caractere nao reconhecido: %c.\n", yytext[0]);
    return -1; }
%%
 /* Secao dos  Procedimentos auxiliares  */

 /* Para redefinir a entrada padrao do LEX. 
  * Redefinir a variavel 'yyin' para ler de um arquivo. Por exemplo:
     yyin = fopen("Meu_programa.c", "r");
  * ira mandar ler o programa a ser compilado pelo analisador lexical
  * em 'Meu_programa.c'.
  * O default eh ler da entrada standard (o teclado).
  */

extern FILE *yyin;
FILE *output;

int main(int argc, char* argv[]) {

   int token;
   
   if (argc != 2) {
     printf("uso: %s <input_file>. Try again!\n", argv[0]);
     exit(-1);
   }
   
   yyin = fopen(argv[1], "r");
   
   output = fopen("results.txt", "w+");
   
   if (!yyin) {
     printf("Uso: %s <input_file>. Could not find %s. Try again!\n", argv[0], argv[1]);
     exit(-1);
   }
   
   token = yylex();
   
   fwrite(&token, sizeof(token), 1, output);
   fclose(output);
   
   return 0;
}
